﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GeneralLibs;
using Lists;
using System.Linq;
using System.Data.Objects;
using CustomControls;
using Vouchers;
using BasicForms;
using System.Threading;
using System.Data.SqlClient;
using Excel = Microsoft.Office.Interop.Excel;
using KhuyenMai;
using ListForms;
using System.IO;
using System.Diagnostics;

namespace BanLe
{
    public partial class FrmEditHoaDonBanLe : FrmBase
    {
        private bool _AllowSave = true; //Cờ cho phép chạy menthod Save() hay không.
        private bool _AllowShowMessageXuatHangAm = true; //Cờ cho phép hiện thông báo hay k. Vì khi check xuất âm ở row["VatTuHangHoa1ID"], và row["Value1"] khác nhau. Có sẽ có lúc bị hiện 2 lần.
        private DataRow _DetectedHangTonAm = null;  //Cờ dành cho kiểm tra thuốc xuất âm tại row["VatTuHangHoa1ID"]
        private ChuongTrinhKhuyenMai _ActiveChuongTrinhKhuyenMai = null;    //Lưu chương trình khuyến mại đang hoạt động
        private SqlConnection con;
        private SqlCommand cmd;

        #region Change event and delegate
        public delegate void OnVoucherChanged(ChungTu chungTu);
        /// <summary>
        /// Occur whenever this voucher is modified: added new, deleted, updated
        /// </summary>
        /// <param name="?"></param>
        /// <returns></returns>
        public event OnVoucherChanged VoucherChanged;
        #endregion

        #region RequestAddNew event and delegate
        public delegate void OnRequestAddNew();
        /// <summary>
        /// Occur whenever this voucher is modified: added new, deleted, updated
        /// </summary>
        /// <param name="?"></param>
        /// <returns></returns>
        public event OnRequestAddNew RequestAddNew;
        #endregion

        #region DanhSachChungTu property
        private DanhSachChungTu _DanhSachChungTu;
        public DanhSachChungTu DanhSachChungTu
        {
            get
            {
                return _DanhSachChungTu;
            }
            set
            {
                _DanhSachChungTu = value;
            }
        }
        #endregion

        #region ChungTu property
        private ChungTu _ChungTu;
        public ChungTu ChungTu
        {
            get
            {
                return _ChungTu;
            }
            set
            {
                _ChungTu = value;
            }
        }
        #endregion

        #region EditState property
        private EditState _EditState;
        public EditState EditState
        {
            get
            {
                return _EditState;
            }
            set
            {
                _EditState = value;
            }
        }
        #endregion

        private DataTable _GridDataSouce
        {
            get
            {
                if (customGridKhoanMuc.DataSource is DataTable)
                    return customGridKhoanMuc.DataSource as DataTable;
                else return null;
            }
        }

        public FrmEditHoaDonBanLe()
        {
            try
            {
                InitializeComponent();

                DieuKienTimKiemChungTu dieuKienTimKiemChungTu = new DieuKienTimKiemChungTu();
                dieuKienTimKiemChungTu.LoaiChungTu = DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe");

                _DanhSachChungTu = new DanhSachChungTu();
                _DanhSachChungTu.LoadFromDB(dieuKienTimKiemChungTu.BuildSqlStatement(1000000, 1));

                con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                cmd = con.CreateCommand();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        public FrmEditHoaDonBanLe(ChungTu chungTu)
        {
            try
            {
                InitializeComponent();
                _ChungTu = chungTu;

                DieuKienTimKiemChungTu dieuKienTimKiemChungTu = new DieuKienTimKiemChungTu();
                dieuKienTimKiemChungTu.LoaiChungTu = DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe");

                _DanhSachChungTu = new DanhSachChungTu();
                _DanhSachChungTu.LoadFromDB(dieuKienTimKiemChungTu.BuildSqlStatement(1000000, 1));

                con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                cmd = con.CreateCommand();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void FrmEditHoaDonBanLe_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;

            chkIsETC.Checked = false;
            btnSaveAndPrint.Text = "Lưu và In\n(F8)";
            btnSave.Text = "Lưu\n(F4)";
            btnCreateNew.Text = "Tạo mới\n(F2)";
            btnPrint.Text = "In\n(F12)";


            timerKhuyenMai.Interval = 1000; // Để một giây để check khuyến mại luôn.
            try
            {

                txtNguoiGiamHo.Properties.ReadOnly = true;
                BasicForms.FrmProgressBarDev.StartShowProgress();

                lblTenCuaHang.Text = string.Format("{0}, {1}", GeneralLibs.LocalSettings.HeThong.TenCuaHang, GeneralLibs.LocalSettings.HeThong.DiaChi);

                #region cmbDoiTuong
                cmbDoiTuong.DataSource = DanhMucDoiTuongNghiepVu.Instance.DataView;
                cmbDoiTuong.DisplayColumn = "Ten";
                cmbDoiTuong.ValueColumn = "ID";
                cmbDoiTuong.AddVisibleColumn("Ma", "Mã");
                cmbDoiTuong.AddVisibleColumn("Ten", "Tên");
                #endregion

                #region cmbKho
                cmbKho.DataSource = DanhMucKho.Instance.DataView;
                cmbKho.DisplayColumn = "Ten";
                cmbKho.ValueColumn = "ID";
                cmbKho.AddVisibleColumn("Ma", "Mã");
                cmbKho.AddVisibleColumn("Ten", "Tên");
                #endregion

                #region cmbMaHang
                //cmbMaHang.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                if (chkIsETC.Checked)
                    cmbMaHang.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaForOTC().DataView;
                else
                    cmbMaHang.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaForNoneOTC().DataView;

                cmbMaHang.PopupWidth = 550;
                cmbMaHang.PopupHeight = 297;
                cmbMaHang.DisplayColumn = "Ma";
                cmbMaHang.ValueColumn = "ID";
                cmbMaHang.AddVisibleColumn("Ma", "Mã", 120, 1);
                cmbMaHang.AddVisibleColumn("Ten", "Tên", 150, 2);
                cmbMaHang.AddVisibleColumn("GiaBia", "Giá bán", 35, 4); cmbMaHang.AddVisibleColumn("HoatChat", "Hoạt chất", 150, 3);

                //Có cho phép hiển thị gridRef khi search số ở cmbMaHang hay k
                if (Config.SuDungSearchWithNumberChoCombo == SuDungSearchWithNumberChoCombo.DuocPhep)
                    cmbMaHang.SearchWithNumber = true;
                else
                    cmbMaHang.SearchWithNumber = false;
                #endregion

                #region cmbThueSuat
                cmbThueSuat.DataSource = DanhMucThueSuat.Instance.DataView;
                cmbThueSuat.DisplayColumn = "Ten";
                cmbThueSuat.ValueColumn = "ID";
                cmbThueSuat.AddVisibleColumn("Ma", "Mã");
                cmbThueSuat.AddVisibleColumn("Ten", "Tên");
                #endregion

                #region DataForGrid
                CustomControls.DataForGrid dataForGrid = null;

                dataForGrid = new CustomControls.DataForGrid();
                customGridKhoanMuc.PopupHeight = 297;
                customGridKhoanMuc.PopupWidth = 550;

                //dataForGrid.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                if (!chkIsETC.Checked)
                    dataForGrid.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaForOTC().DataView;
                else
                    dataForGrid.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaForNoneOTC().DataView;
                dataForGrid.AddVisibleColumn("Ma", "Mã", 100, 1);
                dataForGrid.AddVisibleColumn("Ten", "Tên", 150, 2);
                dataForGrid.AddVisibleColumn("HoatChat", "Hoạt chất", 150, 3); dataForGrid.AddVisibleColumn("GiaBia", "Giá bán", 35, 4);
                dataForGrid.AddVisibleColumn("HoatChat", "Hoạt chất", 150, 3); dataForGrid.AddVisibleColumn("GiaBia", "Giá bán", 35, 4);

                dataForGrid.DisplayColumn = "Ma";
                dataForGrid.ValueColumn = "ID";
                customGridKhoanMuc.HtDataForGrid.Clear();
                customGridKhoanMuc.HtDataForGrid.Add("VatTuHangHoa1ID", dataForGrid);
                #endregion

                if (_ChungTu == null || _ChungTu.ChungTuID == Guid.Empty)
                {
                    lblNguoiBan.Text = CustomSecurity.User.CurUser.FullName;

                    MayTinh mt = DanhMucMayTinh.Instance.GetByHardwareID(GeneralLibs.LocalSettings.HeThong.HardwareID);
                    if (mt != null)
                        lblTenMay.Text = mt.Ten;

                    #region Format giao dien cac cot
                    _ChungTu = _DanhSachChungTu.CreateNew(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe"));
                    _ChungTu.LoadDanhSachChungTuPhuThuoc();
                    ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc.CreateNew(DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho"));
                    phieuXuatKho.LoadKhoanMuc();
                    customGridKhoanMuc.DataSource = phieuXuatKho.DanhSachKhoanMuc.DataTable;
                    customGridKhoanMuc.FormatColumns(GeneralLibs.Config.GiaoDienChungTu.Filter(_ChungTu.LoaiChungTuID));
                    #endregion

                    #region Default values
                    DoiTuongNghiepVu khachLe = DanhMucDoiTuongNghiepVu.GetDanhMucKhachHang().GetByTen("Khách lẻ");
                    if (khachLe != null)
                    {
                        cmbDoiTuong.EditValue = khachLe.ID;
                    }

                    cmbMaHang.EditValue = null;
                    if ((Guid)GeneralLibs.LocalSettings.HeThong.KhoID != Guid.Empty)
                        cmbKho.EditValue = GeneralLibs.LocalSettings.HeThong.KhoID;
                    //if ((Guid)GeneralLibs.LocalSettings.HeThong.ThueSuatID != Guid.Empty)
                    cmbThueSuat.EditValue = GeneralLibs.LocalSettings.HeThong.ThueSuatID;
                    //else
                    //    cmbThueSuat.EditValue = DanhMucThueSuat.Instance[0];
                    #endregion

                    Reset();
                }
                else
                {
                    if (_ChungTu.UserID is Guid && _ChungTu.UserID != Guid.Empty)
                        lblNguoiBan.Text = CustomSecurity.UserList.Instance.GetByID(_ChungTu.UserID).FullName;

                    string orderNumber = "";
                    if (CommonLib.StartWithSoMay(_ChungTu.So))
                    {
                        orderNumber = _ChungTu.So.Substring(0, 2);
                    }
                    else
                    {
                        MayTinh mayTinh = DanhMucMayTinh.Instance.GetByHardwareID(LocalSettings.HeThong.HardwareID);
                        orderNumber = mayTinh.GetSoMay();
                    }
                    MayTinh mt = DanhMucMayTinh.Instance.GetByOrderNumber(orderNumber);
                    if (mt != null)
                        lblTenMay.Text = mt.Ten;

                    cmbDoiTuong.EditValue = _ChungTu.DoiTuongNghiepVu1ID;
                    cmbKho.EditValue = _ChungTu.Kho1ID;
                    cmbThueSuat.EditValue = _ChungTu.ThueSuat1ID;
                    txtSo.EditValue = _ChungTu.So;
                    dateNgay.EditValue = _ChungTu.Ngay.Date;
                    cmbMaHang.EditValue = null;

                    txtTongChietKhau.EditValue = _ChungTu.Value8;
                    txtTongGiaBia.EditValue = _ChungTu.Value13;
                    txtTongSoTien.EditValue = _ChungTu.SoTienNT;
                    txtTongSoLuong.EditValue = _ChungTu.Value11;

                    txtSoTienKhachDua.EditValue = _ChungTu.Value2;
                    txtSoTienTraLai.EditValue = _ChungTu.Value3;

                    //Thong tin nguoi mua
                    txtHoTenNguoiMua.Text = _ChungTu.HoTenBenhNhan;
                    nmrTuoi.Text = _ChungTu.TuoiBenhNhan.ToString();
                    txtDiaChi_SDT.Text = _ChungTu.DiaChi_DienThoaiBenhNhan;
                    txtNguoiGiamHo.Text = _ChungTu.NguoiGiamHoBenhNhan;
                    txtChuanDoanBacSy.Text = _ChungTu.ChuanDoanBacSy;

                    //Thong tin bác sỹ
                    txtHoTenBacSy.Text = _ChungTu.HoTenBacSy;
                    txtDiaChiDienThoaiBacSy.Text = _ChungTu.DiaChi_DienThoaiBacSy;
                    dateEditNgayKeDon.EditValue = _ChungTu.NgayKeDonBacSy;

                    chkIsETC.Checked = _ChungTu.IsETC;

                    SetEditState(EditState.SavedInLedger);

                    _ChungTu.LoadDanhSachChungTuPhuThuoc();
                    ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc.GetFirstRow();
                    phieuXuatKho.LoadKhoanMuc();
                    customGridKhoanMuc.DataSource = phieuXuatKho.DanhSachKhoanMuc.DataTable;
                    customGridKhoanMuc.FormatColumns(GeneralLibs.Config.GiaoDienChungTu.Filter(_ChungTu.LoaiChungTuID));
                }


                SetNumberDisplayFormat();
                BasicForms.FrmProgressBarDev.FinishShowProgress();
                timer.Start();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        protected void SetEditState(EditState editState)
        {
            try
            {
                _EditState = editState;
                base.SetEditState(EditState);
                switch (editState)
                {
                    case EditState.Modifying:
                    case EditState.CreatingNew:
                        btnSave.Enabled = true;
                        btnSaveAndPrint.Enabled = true;
                        btnPrint.Enabled = false;

                        if (Config.DuocPhepSuaNgayHoaDon != DuocPhepSuaNgayHoaDonHayKhong.DuocPhep) dateNgay.Properties.ReadOnly = true;
                        break;
                    case EditState.Saved:
                    case EditState.SavedInLedger:
                        btnSave.Enabled = false;
                        btnSaveAndPrint.Enabled = false;
                        btnPrint.Enabled = true;
                        btnPrint.Enabled = true;
                        break;
                }

                dateEditNgayKeDon.Visible = true;
                dateEditNgayKeDon.Properties.ReadOnly = false;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        protected void SetNumberDisplayFormat()
        {
            try
            {
                FormatTextEdit(txtTongSoLuong, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtSoTienKhachDua, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtSoTienTraLai, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtTongGiaBia, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtTongSoTien, BasicForms.TextFormatType.Money);
                FormatTextEdit(txtTongChietKhau, BasicForms.TextFormatType.Money);
                FormatNumberInGridView(customGridKhoanMuc.gridViewKhoanMuc);

                txtTongSoLuong.Properties.ReadOnly = true;
                txtTongGiaBia.Properties.ReadOnly = true;
                txtTongSoTien.Properties.ReadOnly = true;
                txtSoTienTraLai.Properties.ReadOnly = true;
                txtTongChietKhau.Properties.ReadOnly = true;

                customGridKhoanMuc.gridViewKhoanMuc.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.False;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            try
            {
                switch (keyData)
                {
                    case Keys.F2:
                        Reset();
                        return true;
                        break;
                    case Keys.F6:
                        txtHoTenNguoiMua.SelectAll();
                        txtHoTenNguoiMua.Focus();
                        break;
                        return true;
                        break;
                    case Keys.F4:
                        Save();
                        return true;
                        break;
                    case Keys.F5:
                        txtSoTienKhachDua.SelectAll();
                        txtSoTienKhachDua.Focus();
                        return true;
                    case Keys.F8:
                        SaveAndPrint();
                        return true;
                        break;
                    case Keys.F12:
                        if (_EditState == EditState.Saved || _EditState == EditState.SavedInLedger)
                        {
                            Print();
                        }
                        return true;
                        break;
                    case Keys.Alt | Keys.K:
                        txtSoTienKhachDua.SelectAll();
                        txtSoTienKhachDua.Focus();
                        return true;
                        break;
                    case Keys.F7:
                        cmbMaHang.Focus();
                        return true;
                        break;
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.E:
                        ReadFromExcel();
                        return true;
                        break;
                    case Keys.F11:
                        TruSoLuongBangPhimTat();
                        return true;
                        break;
                    default:
                        return base.ProcessCmdKey(ref msg, keyData);
                        break;
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        private void ReadFromExcel()
        {
            try
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Excel file|*.xlsx;*.xls";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    BasicForms.FrmProgressBarDev.StartShowProgress();

                    string path = openFileDialog.FileName;
                    Excel.ApplicationClass app = new Microsoft.Office.Interop.Excel.ApplicationClass();
                    Excel.Workbook workBook = app.Workbooks.Open(path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t",
                                    false, false, 0, true, 1, 0);
                    Excel.Worksheet workSheet = (Excel.Worksheet)workBook.ActiveSheet;
                    Excel.Range range = workSheet.UsedRange;

                    if (range.Columns.Count >= 4)
                    {
                        Hashtable htHangKhongHople = new Hashtable();
                        for (int rowIndex = 2; rowIndex <= range.Rows.Count; rowIndex++)
                        {
                            try
                            {
                                string maHang = "";
                                decimal soLuong = 0;
                                decimal donGia = 0;
                                decimal chietKhauMua = 0;
                                VatTuHangHoa hanghoa = null;

                                #region Doc cac o du lieu tu Excel va Check hop le
                                try
                                {
                                    maHang = (range.Cells[rowIndex, 2] as Excel.Range).Text.ToString().Trim();
                                }
                                catch (Exception ex)
                                {
                                }
                                try
                                {
                                    soLuong = Convert.ToDecimal((range.Cells[rowIndex, 3] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                {
                                }
                                try
                                {
                                    donGia = decimal.Parse((range.Cells[rowIndex, 4] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                {
                                }
                                try
                                {
                                    chietKhauMua = decimal.Parse((range.Cells[rowIndex, 5] as Excel.Range).Value2.ToString().Trim());
                                }
                                catch (Exception ex)
                                {
                                }
                                try
                                {
                                    hanghoa = Lists.DanhMucVatTuHangHoa.Instance.GetByProperty("Ma", maHang);
                                }
                                catch (Exception ex)
                                {
                                }

                                if (maHang == "" && soLuong != 0 && donGia != 0)
                                {
                                    MessageBox.Show(string.Format("Mã thuốc ở dòng số {0} không hợp lệ", rowIndex - 2));
                                    continue;
                                }
                                #endregion

                                if (maHang != "" && hanghoa != null)
                                {
                                    DataRow row = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.NewRow();
                                    row["VatTuHangHoa1ID"] = hanghoa.ID;
                                    row["Value1"] = soLuong;
                                    row["Value4"] = donGia;
                                    row["Value8"] = chietKhauMua;
                                    row["Value12"] = hanghoa.GiaBia;
                                    _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.Rows.Add(row);
                                }
                                else
                                {
                                    if (!htHangKhongHople.ContainsKey(maHang)) htHangKhongHople.Add(maHang, null);
                                }
                            }
                            catch (SqlException sqlEx)
                            {
                                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                            }
                            catch (Exception ex)
                            {
                                if (ex is CustomException) throw ex;
                                else
                                {
                                    throw new Exception(ex.Message);
                                }
                            }
                        }
                    }
                    workBook.Close(false, path, true);
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                FillTongCong();
                BasicForms.FrmProgressBarDev.FinishShowProgress();
            }
        }

        private void Edit()
        {
            try
            {
                //Không cho phép sửa hóa đơn đã quá hạn
                if (Config.SoNgayDuocPhepSuaHoaDon > 0) //Nếu lớn hơn bằng 0 là có hạn cho việc sửa hóa đơn chứng từ đã tạo trước đó
                {
                    //nếu là Supadmin hoặc nhóm admin thì cho sửa. Ngoài ra là không cho sửa
                    if (CustomSecurity.User.CurUser.UserName != "SupAdmin" && !CustomSecurity.User.CurUser.RoleList.ContainsKey("Admin")
                        && !CustomSecurity.User.CurUser.RoleList.ContainsValue("Admin"))
                    {
                        DateTime ngayHoaDon = Convert.ToDateTime(_ChungTu.Ngay.Date.ToString("dd/MM/yyyy"));    //Đưa về 0h giờ để chỉ so sánh ngày
                        DateTime toDay = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy"));
                        if (ngayHoaDon.AddDays((int)Config.SoNgayDuocPhepSuaHoaDon) < toDay)
                            throw new CustomException(string.Format("Hạn sửa lại hóa đơn - chứng từ là {0} ngày. Hóa đơn - chứng từ này đã hết hạn. Liên hệ với quản lý để biết thêm thông tin.", Config.SoNgayDuocPhepSuaHoaDon), ExceptionType.LackOfInputInfo);
                    }
                }
                else if (Config.SoNgayDuocPhepSuaHoaDon == 0)
                {
                    //nếu là Supadmin hoặc nhóm admin thì cho sửa. Ngoài ra là không cho sửa
                    if (CustomSecurity.User.CurUser.UserName != "SupAdmin" && !CustomSecurity.User.CurUser.RoleList.ContainsKey("Admin")
                        && !CustomSecurity.User.CurUser.RoleList.ContainsValue("Admin"))
                    {
                        DateTime ngayHoaDon = Convert.ToDateTime(_ChungTu.Ngay.Date.ToString("dd/MM/yyyy"));    //Đưa về 0h giờ để chỉ so sánh ngày
                        DateTime toDay = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy"));
                        if (ngayHoaDon.AddDays((int)Config.SoNgayDuocPhepSuaHoaDon) <= toDay)
                            throw new CustomException(string.Format("Hạn sửa lại hóa đơn - chứng từ là {0} ngày. Hóa đơn - chứng từ này đã hết hạn. Liên hệ với quản lý để biết thêm thông tin.", Config.SoNgayDuocPhepSuaHoaDon), ExceptionType.LackOfInputInfo);
                    }
                }

                BasicForms.FrmProgressBarDev.StartShowProgress();
                _ChungTu.BoGhiSo();

                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.ColumnChanged += new DataColumnChangeEventHandler(DataTable_ColumnChanged);
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.RowChanged += new DataRowChangeEventHandler(DataTable_RowChanged);
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.RowDeleted += new DataRowChangeEventHandler(DataTable_RowDeleted);

                cmbMaHang.EditValue = null;
                SetEditState(GeneralLibs.EditState.Modifying);
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                BasicForms.FrmProgressBarDev.FinishShowProgress();
            }
        }

        private void Reset()
        {
            try
            {
                int countKhoanMuc = 0;
                if (customGridKhoanMuc.DataSource is DataTable) countKhoanMuc = (customGridKhoanMuc.DataSource as DataTable).Rows.Count;

                if (!_ChungTu.GhiSo && countKhoanMuc > 0)
                {
                    if (MessageBox.Show("Chứng từ này chưa Lưu. Bạn có muốn Lưu không?", "Cảnh báo", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        if (!Save())
                        {
                            return;
                        }
                    }
                }
                BasicForms.FrmProgressBarDev.StartShowProgress();
                cmbMaHang.Focus();
                _ChungTu = _DanhSachChungTu.CreateNew(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe"));
                _ChungTu.LoadDanhSachChungTuPhuThuoc();
                ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc.CreateNew(DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho"));

                Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                Kho khoXuat = null;
                if (cmbKho.EditValue is Guid)
                {
                    khoXuat = DanhMucKho.Instance.GetByID((Guid)cmbKho.EditValue);

                    if (store.Ten.ToUpper().Contains("VIETBOOK"))
                        if (khoXuat != null)
                            phieuXuatKho.So = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho").ID, khoXuat.Ma + "PXBL", 7, true);
                        else
                            phieuXuatKho.So = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("PhieuNhapKho").ID, khoXuat.Ma + "PNBL", 7, true);
                    else
                        if (khoXuat != null)
                            phieuXuatKho.So = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho").ID, khoXuat.Ma + "/XL" + @"/", 7, true);
                        else
                            phieuXuatKho.So = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("PhieuNhapKho").ID, "XL", 7, true);
                }

                _ChungTu.DanhSachChungTuPhuThuoc.Add(phieuXuatKho);

                #region Bound data for customGridKhoanMuc
                phieuXuatKho.LoadKhoanMuc();
                customGridKhoanMuc.DataSource = phieuXuatKho.DanhSachKhoanMuc.DataTable;
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.ColumnChanged += new DataColumnChangeEventHandler(DataTable_ColumnChanged);
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.RowChanged += new DataRowChangeEventHandler(DataTable_RowChanged);
                _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.RowDeleted += new DataRowChangeEventHandler(DataTable_RowDeleted);
                #endregion

                cmbMaHang.EditValue = null;

                if (store.Ten.ToUpper().Contains("VIETBOOK"))  // Nếu không là cty sách HN VietBook thì chỉ hiển thị thông báo
                {
                    if (khoXuat != null)
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, khoXuat.Ma + "BL", 7, true);
                    else
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);
                }
                else
                    txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);

                dateNgay.EditValue = GeneralLibs.CommonLib.GetSystemDateTime();
                txtTongSoLuong.EditValue = (decimal)0;
                txtTongChietKhau.EditValue = (decimal)0;
                txtTongGiaBia.EditValue = (decimal)0;
                txtTongSoTien.EditValue = (decimal)0;
                txtSoTienKhachDua.EditValue = (decimal)0;
                txtSoTienTraLai.EditValue = (decimal)0;

                txtHoTenNguoiMua.Text = "";
                nmrTuoi.Text = "";
                txtDiaChi_SDT.Text = "";
                txtNguoiGiamHo.Text = "";
                txtChuanDoanBacSy.Text = "";

                txtHoTenBacSy.Text = "";
                txtDiaChiDienThoaiBacSy.Text = "";
                dateEditNgayKeDon.EditValue = null;

                SetEditState(GeneralLibs.EditState.CreatingNew);

                BasicForms.FrmProgressBarDev.FinishShowProgress();
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        protected void SaveAndPrint()
        {
            try
            {
                if (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying)
                {
                    if (Save())
                        Print();
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        protected bool CheckTienThuaThieu()
        {
            try
            {
                if (txtSoTienKhachDua.EditValue is decimal && txtTongSoTien.EditValue is decimal)
                {
                    if ((decimal)txtSoTienKhachDua.EditValue >= (decimal)txtTongSoTien.EditValue)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }

        }
        protected bool Save()
        {
            try
            {
                btnSave.Focus();    //Để lost focus khỏi grid --> đồng bộ giữa DataTable và Grid

                //CheckXuatHangAm();
                if (!_AllowSave)    //Nếu cờ cho phép lưu tắt
                {
                    _AllowSave = true;  //Đã kiểm tra xong, đưa cờ cho phép lưu về giá trị true
                    cmbMaHang.Focus(); //Focus trở lại cmbMaHang để nhập tiếp thuốc
                    return false;   //k cho lưu
                }

                FillTongCong();
                if (Config.DuocLuuHDBLKhiKhahDuaThieuTien == DuocLuuHDBLKhiKhahDuaThieuTienHayKhong.KhongDuocPhep &&
                    !CheckTienThuaThieu())
                {
                    MessageBox.Show("Tiền khách đưa chưa đủ.\nCần thu thêm tiền.");
                    return false;
                }

                try
                {
                    if (!CheckFullInfo()) return false;
                    _ChungTu.So = txtSo.Text;
                    if (CommonLib.StartWithSoMay(txtSo.Text)) _ChungTu.SoKhongKemSoMay = CommonLib.CutSoMayWithOutSoChungTu(txtSo.Text);
                    else _ChungTu.SoKhongKemSoMay = txtSo.Text;
                    _ChungTu.Ngay = new NullableDate(dateNgay.DateTime);
                    _ChungTu.DoiTuongNghiepVu1ID = (Guid)cmbDoiTuong.EditValue;
                    _ChungTu.TenNguoiThucHien = DanhMucDoiTuongNghiepVu.Instance.GetByID(_ChungTu.DoiTuongNghiepVu1ID).Ten;
                    _ChungTu.TaiKhoan1ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("BanLe_NoTienThuVe");
                    _ChungTu.TaiKhoan2ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("VatDauRa");
                    _ChungTu.TaiKhoan4ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("BanLe_CoDoanhThu");
                    _ChungTu.ThueSuat1ID = (Guid)cmbThueSuat.EditValue;
                    _ChungTu.TienTeID = DanhMucTienTe.Instance.GetTienHoachToan().ID;
                    _ChungTu.TyGiaThucTe = 1;
                    _ChungTu.Kho1ID = (Guid)cmbKho.EditValue;

                    _ChungTu.SoTienNT = _ChungTu.SoTienQD = (decimal)txtTongSoTien.EditValue;   //tien phai thanh toan
                    if (txtSoTienKhachDua.EditValue is decimal) _ChungTu.Value2 = (decimal)txtSoTienKhachDua.EditValue;         //tien dua
                    _ChungTu.Value3 = _ChungTu.Value2 - _ChungTu.SoTienNT;          //tien thua
                    decimal thueSuat = DanhMucThueSuat.Instance.GetByID(_ChungTu.ThueSuat1ID).MucThueSuat;
                    _ChungTu.Value6 = _ChungTu.SoTienQD / (1 + thueSuat); //tien hang
                    _ChungTu.Value5 = _ChungTu.SoTienQD * thueSuat / (1 + thueSuat);//tien thue VAT
                    _ChungTu.Value13 = (decimal)txtTongGiaBia.EditValue;             //gia bia
                    _ChungTu.Value11 = (decimal)txtTongSoLuong.EditValue;            //so luong
                    _ChungTu.Value8 = (decimal)txtTongChietKhau.EditValue;          //tien chiet khau

                    //Thong tin nguoi mua
                    _ChungTu.HoTenBenhNhan = txtHoTenNguoiMua.Text;
                    if (nmrTuoi.Text != "")
                        _ChungTu.TuoiBenhNhan = Convert.ToInt32(nmrTuoi.Text);
                    else _ChungTu.TuoiBenhNhan = 0;
                    _ChungTu.DiaChi_DienThoaiBenhNhan = txtDiaChi_SDT.Text;
                    _ChungTu.NguoiGiamHoBenhNhan = txtNguoiGiamHo.Text;
                    _ChungTu.ChuanDoanBacSy = txtChuanDoanBacSy.Text;

                    //Thông tin bác sỹ
                    _ChungTu.HoTenBacSy = txtHoTenBacSy.Text;
                    _ChungTu.DiaChi_DienThoaiBacSy = txtDiaChiDienThoaiBacSy.Text;
                    if (dateEditNgayKeDon.DateTime.Year >= 1975)
                        _ChungTu.NgayKeDonBacSy = dateEditNgayKeDon.DateTime;
                    else
                        _ChungTu.NgayKeDonBacSy = null;

                    _ChungTu.IsETC = chkIsETC.Checked;
                    _ChungTu.GhiSo = true;

                    ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc[0];
                    phieuXuatKho.LoaiChungTuID = DanhMucLoaiChungTu.Instance.GetByMa("PhieuXuatKho").ID;
                    phieuXuatKho.DinhKhoan = false;

                    BasicForms.FrmProgressBarDev.StartShowProgress();
                    BasicForms.FrmProgressBarDev.Status = "Đang tính giá vốn thuốc xuất kho";
                    try
                    {
                        foreach (KhoanMucChungTu khoanMuc in phieuXuatKho.DanhSachKhoanMuc)
                        {
                            khoanMuc.Value2 = VatTuHangHoa.CalculateGiaXuatKho(khoanMuc.VatTuHangHoa1ID, (Guid)cmbKho.EditValue, dateNgay.DateTime, khoanMuc.Value1);
                        }
                    }
                    catch (SqlException sqlEx)
                    {
                        throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                    }
                    catch (Exception ex)
                    {
                        if (ex is CustomException) throw ex;
                        else
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    BasicForms.FrmProgressBarDev.FinishShowProgress();

                    phieuXuatKho.Ngay = _ChungTu.Ngay;
                    phieuXuatKho.SoChungTuGoc = txtSo.Text;
                    phieuXuatKho.DoiTuongNghiepVu1ID = (Guid)cmbDoiTuong.EditValue;
                    phieuXuatKho.TenNguoiThucHien = cmbDoiTuong.Text;
                    phieuXuatKho.DienGiai = "Xuất kho bán lẻ";
                    phieuXuatKho.TaiKhoan1ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("BanLe_NoGiaVon");
                    phieuXuatKho.TaiKhoan2ID = (Guid)DanhMucCauHinhTaiKhoanMacDinh.Instance.GetTaiKhoanIDByTinhChat("BanLe_CoXuatKho");
                    phieuXuatKho.TienTeID = _ChungTu.TienTeID;
                    phieuXuatKho.TyGiaThucTe = _ChungTu.TyGiaThucTe;

                    phieuXuatKho.Kho1ID = (Guid)cmbKho.EditValue;
                    phieuXuatKho.DangXuatID = DanhMucDangXuat.Instance.GetByProperty("IsBuildInRecord", true).ID;
                    if (CommonLib.StartWithSoMay(phieuXuatKho.So)) phieuXuatKho.SoKhongKemSoMay = CommonLib.CutSoMayWithOutSoChungTu(phieuXuatKho.So);
                    else phieuXuatKho.SoKhongKemSoMay = phieuXuatKho.So;

                    phieuXuatKho.SoTienNT = 0;
                    foreach (KhoanMucChungTu khoanMuc in phieuXuatKho.DanhSachKhoanMuc)
                    {
                        if (khoanMuc.DataRow["Value3"] is decimal) phieuXuatKho.SoTienNT += khoanMuc.Value3;
                    }
                    phieuXuatKho.SoTienQD = phieuXuatKho.SoTienNT;

                    for (int i = 0; i < customGridKhoanMuc.gridViewKhoanMuc.DataRowCount; i++)
                    {
                        DataRow row = customGridKhoanMuc.gridViewKhoanMuc.GetDataRow(i);
                        foreach (KhoanMucChungTu khoanMuc in phieuXuatKho.DanhSachKhoanMuc)
                        {
                            if (khoanMuc.VatTuHangHoa1ID == (Guid)row["VatTuHangHoa1ID"] && khoanMuc.ThuTuKhoanMucTrongChungTu != i) khoanMuc.ThuTuKhoanMucTrongChungTu = i;
                        }
                    }

                    if (_EditState == EditState.CreatingNew)
                        _ChungTu.InsertAndGhiSo();
                    else if (_EditState == EditState.Modifying)
                        _ChungTu.UpdateAndGhiSo();

                    SetEditState(EditState.Saved);
                    return true;
                }
                catch (Exception ex)
                {
                    if (ex is CustomException && (ex as CustomException).ExceptionType == ExceptionType.SoChungTuDaCo)
                    {
                        ChungTu phieuXuatKho = _ChungTu.DanhSachChungTuPhuThuoc[0];

                        if (ex.Message.Contains(txtSo.Text))
                            txtSo.Text = CommonLib.TangSoChungTuTuDong(txtSo.Text, 1);
                        else if (ex.Message.Contains(phieuXuatKho.So))
                        {
                            if (_ChungTu.DanhSachChungTuPhuThuoc.Count >= 1)
                            {
                                phieuXuatKho.So = CommonLib.TangSoChungTuTuDong(phieuXuatKho.So, 1);
                            }
                        }
                        Save();
                    }
                    else
                        FrmExceptionNotifier.ShowAndLog(ex);
                    return false;
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        protected void PrintQuaCrystalReport()
        {
            try
            {
                if (_ChungTu != null && _ChungTu.ChungTuID != Guid.Empty)
                {
                    _ChungTu.PrintHĐBLQuaCrystalReport();
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        protected void Print()
        {
            try
            {
                if (_ChungTu != null && _ChungTu.ChungTuID != Guid.Empty)
                {
                    _ChungTu.PrintChungTu();
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        private void FillTongCong()
        {
            try
            {
                decimal tienVat = 0, thueSuat = 0;
                decimal tienHangChuaThue = 0;
                decimal tongTheoGiaBia = 0, tongSoTien = 0;
                foreach (DataRow row in _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.Rows)
                {
                    if (row.RowState != DataRowState.Deleted)
                    {
                        if (row["Value5"] is decimal)
                            tienHangChuaThue += (decimal)Math.Round((decimal)row["Value5"]);
                        if (row["Value7"] is decimal)
                            tongSoTien += (decimal)Math.Round((decimal)row["Value7"]);
                        if (row["Value13"] is decimal)
                            tongTheoGiaBia += (decimal)Math.Round((decimal)row["Value13"]);
                    }
                }

                if (cmbThueSuat.EditValue is Guid && (Guid)cmbThueSuat.EditValue != Guid.Empty)
                {
                    thueSuat = DanhMucThueSuat.Instance.GetByID((Guid)cmbThueSuat.EditValue).MucThueSuat;
                    tienVat = tongSoTien * thueSuat;
                }

                txtTongGiaBia.EditValue = tongTheoGiaBia;
                txtTongSoTien.EditValue = tongSoTien;
                txtTongSoLuong.EditValue = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.Compute("SUM (Value1)", "VatTuHangHoa1ID IS NOT NULL");
                txtTongChietKhau.EditValue = tongTheoGiaBia - tongSoTien;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        protected bool CheckFullInfo()
        {
            if (CheckExistedSoChungTuKhongKemSoMayInDB(txtSo.Text, _ChungTu.ChungTuID) &&
                (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_CoSoMay ||
                Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_KhongCoSoMay))
                FrmEditRelativeChungTu_ResolveConflictSoChungTu(txtSo.Text, true, false);
            if (txtSo.Text == "")
            {
                txtSo.Focus();
                throw new CustomException("Hãy nhập số", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (dateNgay.Text == "")
            {
                dateNgay.Focus();
                throw new CustomException("Hãy nhập ngày", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (!(cmbDoiTuong.EditValue is Guid) || (Guid)cmbDoiTuong.EditValue == Guid.Empty)
            {
                cmbDoiTuong.Focus();
                throw new CustomException("Hãy chọn khách hàng", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
            {
                cmbKho.Focus();
                throw new CustomException("Hãy chọn kho xuất", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (!(cmbThueSuat.EditValue is Guid) || (Guid)cmbThueSuat.EditValue == Guid.Empty)
            {
                cmbThueSuat.Focus();
                throw new CustomException("Hãy chọn thuế suất", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (_ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.Count == 0 || (decimal)txtTongSoLuong.EditValue == 0)
            {
                cmbMaHang.Focus();
                throw new CustomException("Hãy chọn thuốc cho hóa đơn", ExceptionType.LackOfInputInfo);
                return false;
            }
            if (chkIsETC.Checked)
            {
                if (txtHoTenNguoiMua.Text == "")
                {
                    txtHoTenNguoiMua.Focus();
                    throw new CustomException("Bạn đang chọn nhập thuốc cần kê đơn (ETC). Hãy nhập họ tên bệnh nhân", ExceptionType.LackOfInputInfo);
                    return false;
                }
                if (txtDiaChi_SDT.Text == "")
                {
                    txtDiaChi_SDT.Focus();
                    throw new CustomException("Bạn đang chọn nhập thuốc cần kê đơn (ETC). Hãy nhập họ địa chỉ - điện thoại của bệnh nhân", ExceptionType.LackOfInputInfo);
                    return false;
                }
                if (nmrTuoi.Text == "")
                {
                    nmrTuoi.Focus();
                    throw new CustomException("Bạn đang chọn nhập thuốc cần kê đơn (ETC). Hãy nhập tuổi bệnh nhân", ExceptionType.LackOfInputInfo);
                    return false;
                }
                if (Convert.ToInt32(nmrTuoi.Text) <= 3 && txtNguoiGiamHo.Text == "")
                {
                    txtNguoiGiamHo.Focus();
                    throw new CustomException("Bạn đang chọn nhập thuốc cần kê đơn (ETC). Bệnh nhân dưới 72 tháng tuổi cần nhập thông tin người giám hộ", ExceptionType.LackOfInputInfo);
                    return false;
                }
                if (txtHoTenBacSy.Text == "")
                {
                    txtHoTenBacSy.Focus();
                    throw new CustomException("Bạn đang chọn nhập thuốc cần kê đơn (ETC). Hãy nhập họ tên bác sỹ", ExceptionType.LackOfInputInfo);
                    return false;
                }
                if (txtDiaChiDienThoaiBacSy.Text == "")
                {
                    txtDiaChiDienThoaiBacSy.Focus();
                    throw new CustomException("Bạn đang chọn nhập thuốc cần kê đơn (ETC). Hãy nhập họ địa chỉ - điện thoại của bác sỹ", ExceptionType.LackOfInputInfo);
                    return false;
                }
                if (txtChuanDoanBacSy.Text == "")
                {
                    txtDiaChiDienThoaiBacSy.Focus();
                    throw new CustomException("Bạn đang chọn nhập thuốc cần kê đơn (ETC). Hãy nhập chuẩn đoán của bác sỹ", ExceptionType.LackOfInputInfo);
                    return false;
                }
                if (dateEditNgayKeDon.Text == "")
                {
                    dateEditNgayKeDon.Focus();
                    throw new CustomException("Bạn đang chọn nhập thuốc cần kê đơn (ETC). Hãy nhập ngày kê đơn", ExceptionType.LackOfInputInfo);
                    return false;
                }
            }
            return true;
        }
        protected bool CheckXuatHangAm()
        {
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
            {
                throw new CustomException("Phải chọn kho trước khi bán thuốc.");
            }
            if (Config.DuocPhepXuatHangAm != DuocPhepXuatHangAmHayKhong.KhongDuocPhep) return true;

            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();

                ChungTu phieuXuat = _ChungTu.DanhSachChungTuPhuThuoc[0];
                ThoiDiemKhoaSo thoiDiemKhoaSoGanNhat = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemChotSoDuGanNhat(dateNgay.DateTime);
                foreach (KhoanMucChungTu khoanMuc in phieuXuat.DanhSachKhoanMuc)
                {
                    TonKho tonTaiKhoNay = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(cmd, dateNgay.DateTime.AddSeconds(-1), (Guid)cmbKho.EditValue, khoanMuc.VatTuHangHoa1ID);
                    if (tonTaiKhoNay.SoLuong < khoanMuc.Value1)
                        throw new CustomException(string.Format("Không đủ thuốc {0} để xuất", DanhMucVatTuHangHoa.Instance.GetByID(khoanMuc.VatTuHangHoa1ID).Ten), ExceptionType.XuatHangAm);
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                con.Close();
            }
            return true;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                Save();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnSaveAndPrint_Click(object sender, EventArgs e)
        {
            try
            {
                SaveAndPrint();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnPrint_Click(object sender, EventArgs e)
        {
            try
            {
                //Print();
                PrintQuaCrystalReport();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnCreateNew_Click(object sender, EventArgs e)
        {
            try
            {
                Reset();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void btnEdit_Click(object sender, EventArgs e)
        {
            try
            {
                Edit();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void FrmEditHoaDonBanLe_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (_ChungTu.ChungTuID != Guid.Empty)
                {
                    string maLoaiChungTu = DanhMucLoaiChungTu.Instance.GetByID(_ChungTu.LoaiChungTuID).Ma;// form đóng thì _ChungTu.LoaiChungTuID đã được set rồi
                    int countKhoanMuc = 0;
                    if (customGridKhoanMuc.DataSource is DataTable) countKhoanMuc = (customGridKhoanMuc.DataSource as DataTable).Rows.Count;
                    if (_EditState != EditState.SavedInLedger && _EditState != EditState.Saved && maLoaiChungTu != "PhieuDatHang" && maLoaiChungTu != "PhieuKiemKe" && countKhoanMuc > 0)
                    {
                        if (MessageBox.Show("Chứng từ này chưa Lưu. Bạn có muốn Lưu không?", "Cảnh báo", MessageBoxButtons.YesNo) == DialogResult.Yes)
                        {
                            Save();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                e.Cancel = true;
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        void DataTable_RowDeleted(object sender, DataRowChangeEventArgs e)
        {
            try
            {
                FillTongCong();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        void DataTable_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            try
            {
                //Kiểm tra không được để kho trống khi nhập thuốc
                if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
                {
                    if (_DetectedHangTonAm != null)
                    {
                        if (customGridKhoanMuc.DataSource is DataTable) (customGridKhoanMuc.DataSource as DataTable).Rows.Remove(_DetectedHangTonAm);
                        _DetectedHangTonAm = null;
                    }
                }
                //Kiểm tra xuất âm
                if (Config.DuocPhepXuatHangAm == DuocPhepXuatHangAmHayKhong.KhongDuocPhep)
                {
                    if (_DetectedHangTonAm != null)
                    {
                        if (customGridKhoanMuc.DataSource is DataTable) (customGridKhoanMuc.DataSource as DataTable).Rows.Remove(_DetectedHangTonAm);
                        _DetectedHangTonAm = null;
                    }
                }
                FillTongCong();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        void DataTable_ColumnChanged(object sender, DataColumnChangeEventArgs e)
        {
            try
            {
                DataRow row = e.Row;
                switch (e.Column.Caption)
                {
                    case "VatTuHangHoa1ID":

                        if (row != null && row["VatTuHangHoa1ID"] is Guid)
                        {
                            #region Chưa chọn kho thì chưa cho nhập thuốc
                            try
                            {
                                if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
                                {
                                    FrmWarning.Show("Thông báo", "Chưa chọn kho.");
                                    _DetectedHangTonAm = row;
                                    SendKeys.Send("{DOWN}");
                                    return;
                                }
                            }
                            catch (Exception ex)
                            {
                            }
                            #endregion

                            #region Xem là thuốc âm thì k cho nhập
                            try
                            {
                                if (Config.DuocPhepXuatHangAm == DuocPhepXuatHangAmHayKhong.KhongDuocPhep)
                                {
                                    TonKho tonToanBo = null;
                                    TonKho tonTaiKhoNay = null;
                                    TinhToanTon((Guid)cmbKho.EditValue, (Guid)row["VatTuHangHoa1ID"], ref tonTaiKhoNay, ref tonToanBo);
                                    if ((int)tonTaiKhoNay.SoLuong <= 0) //nếu xuất âm
                                    {
                                        _AllowShowMessageXuatHangAm = false; //Đã hiện Message khi check tại row["VatTuHangHoa1ID"] (bao giờ cũng được check trước) thì không hiện ở row["Value1"].
                                        MessageBox.Show(string.Format("Không đủ thuốc {0} để xuất", DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).Ten));
                                        _DetectedHangTonAm = row;   //Lưu lại thuốc này và lên DataTable_RowChanged kiểm tra xóa đi nếu cần
                                        SendKeys.Send("{DOWN}");    //Ấn xuống để nhận dòng này là 1 row, lúc này sẽ kích hoạt DataTable_RowChanged.
                                        return;
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                            }
                            #endregion

                            if (!(row["Value1"] is decimal)) row["Value1"] = 1;//sẽ gọi TinhGiaVonLaiTungDong() ở case "Value1":
                            else TinhGiaVonLaiTungDong(row);
                            VatTuHangHoa vatTuHangHoa = DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]);
                            DoiTuongNghiepVu doiTuongNghiepVu = null;
                            if (cmbDoiTuong.EditValue is Guid && (Guid)cmbDoiTuong.EditValue != Guid.Empty)
                            {
                                doiTuongNghiepVu = DanhMucDoiTuongNghiepVu.Instance.GetByID((Guid)cmbDoiTuong.EditValue);
                            }

                            //Nếu sửa hoặc thêm mới thì tính toán để nhập CK và giá bìa lấy từ danh mục
                            DoiTuongKhuyenMai doiTuongKhuyenMai = null;
                            if(_ActiveChuongTrinhKhuyenMai != null && cmbDoiTuong.EditValue is Guid) doiTuongKhuyenMai = DanhMucDoiTuongKhuyenMai.Instance.GetByIDs(_ActiveChuongTrinhKhuyenMai.ID, (Guid)cmbDoiTuong.EditValue);
                           
                            if (doiTuongKhuyenMai != null)
                            {
                                if (_ActiveChuongTrinhKhuyenMai != null && _ActiveChuongTrinhKhuyenMai.KieuKhuyenMai == (int)KieuKhuyenMai.TheoThoiGian)
                                {
                                    ChiTietKhuyenMaiTheoThoiGian chiTietKhuyenMaiTheoThoiGian = DanhMucChiTietKhuyenMaiTheoThoiGian.Instance.GetByKey(_ActiveChuongTrinhKhuyenMai.ID, vatTuHangHoa.ID);
                                    if (chiTietKhuyenMaiTheoThoiGian != null)
                                    {
                                        row["Value8"] = chiTietKhuyenMaiTheoThoiGian.ChietKhauKhuyenMai;
                                        row["ChuongTrinhKhuyenMaiID"] = _ActiveChuongTrinhKhuyenMai.ID;
                                    }
                                    else row["Value8"] = (decimal)0;
                                }
                                else if (_ActiveChuongTrinhKhuyenMai != null && _ActiveChuongTrinhKhuyenMai.KieuKhuyenMai == (int)KieuKhuyenMai.TheoTongTienTichLuy)
                                {
                                    if (cmbDoiTuong.EditValue is Guid)   //Tính tổng số tiền mua thuốc tích lũy
                                    {
                                        if (doiTuongKhuyenMai != null)
                                        {
                                            decimal chietKhauKhuyenMai = 0;
                                            decimal tongSoTien = 0;

                                            tongSoTien = (decimal)DanhMucChiTietKhuyenMaiTheoTongTienTichLuy.Instance.CalculateTongTienTichLuyTheoKhachHang((Guid)cmbDoiTuong.EditValue, _ActiveChuongTrinhKhuyenMai.NgayBatDauTinhTongTien, _ActiveChuongTrinhKhuyenMai.NgayKetThucTinhTongTien);

                                            foreach (ChiTietKhuyenMaiTheoTongTienTichLuy chiTietKhuyenMaiTheoTongTienTichLuy in DanhMucChiTietKhuyenMaiTheoTongTienTichLuy.Filter(string.Format("ChuongTrinhKhuyenMaiID = '{0}'", _ActiveChuongTrinhKhuyenMai.ID)))
                                            {
                                                if (chiTietKhuyenMaiTheoTongTienTichLuy.TongTienTu <= tongSoTien && tongSoTien < chiTietKhuyenMaiTheoTongTienTichLuy.TongTienDen)
                                                {
                                                    if (chiTietKhuyenMaiTheoTongTienTichLuy != null) chietKhauKhuyenMai = chiTietKhuyenMaiTheoTongTienTichLuy.ChietKhauKhuyenMai;
                                                    break;
                                                }
                                            }
                                            //Nếu k nằm trong khoảng tổng tiền nào thì CK = 0
                                            if (chietKhauKhuyenMai >= 0)
                                            {
                                                row["Value8"] = chietKhauKhuyenMai;
                                                row["ChuongTrinhKhuyenMaiID"] = _ActiveChuongTrinhKhuyenMai.ID;
                                            }
                                            else row["Value8"] = (decimal)0;
                                        }
                                        else row["Value8"] = (decimal)0;
                                    }
                                }
                                else if (doiTuongNghiepVu != null && doiTuongNghiepVu.Ma.Contains("VIP"))
                                {
                                    row["Value8"] = vatTuHangHoa.ChietKhauBanLe + doiTuongNghiepVu.ChietKhauTheVIP;
                                }
                                else
                                {
                                    row["Value8"] = vatTuHangHoa.ChietKhauBanLe;
                                }
                            }
                            else if (doiTuongNghiepVu != null && doiTuongNghiepVu.Ma.Contains("VIP"))
                            {
                                row["Value8"] = vatTuHangHoa.ChietKhauBanLe + doiTuongNghiepVu.ChietKhauTheVIP;
                            }
                            else
                            {
                                row["Value8"] = vatTuHangHoa.ChietKhauBanLe;
                            }
                            row["Value12"] = vatTuHangHoa.GiaBia;
                            row["Value2"] = vatTuHangHoa.GiaBia;
                        }
                        break;
                    case "Value1"://SoLuong
                        if (row["Value1"] is decimal)
                        {
                            //Tính toán check xuất âm
                            TonKho tonTaiKhoNay = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(dateNgay.DateTime.AddSeconds(-1), (Guid)cmbKho.EditValue, (Guid)row["VatTuHangHoa1ID"]);
                            if (tonTaiKhoNay.SoLuong < (decimal)row["Value1"] && Config.DuocPhepXuatHangAm == DuocPhepXuatHangAmHayKhong.KhongDuocPhep)  //Nếu xuất âm
                            {
                                if (_AllowShowMessageXuatHangAm)    //nếu được show thông báo mới show.
                                {
                                    MessageBox.Show(string.Format("Không đủ thuốc {0} để xuất", DanhMucVatTuHangHoa.Instance.GetByID((Guid)row["VatTuHangHoa1ID"]).Ten));
                                }
                                _AllowShowMessageXuatHangAm = true;  //cứ chạy qua đây phải bật lại là true, ví đây là check sau row["VatTuHangHoa1ID"]
                                _AllowSave = false; //Bật cờ không được lưu lên

                                //Nếu value12 và 13 đã có số liệu rồi thì dựa vào đó RollBack lại số lượng cũ
                                if (row["Value12"] is decimal && row["Value13"] is decimal && (decimal)row["Value1"] != ((decimal)row["Value13"] / (decimal)row["Value12"]))
                                {
                                    row["Value1"] = (decimal)row["Value13"] / (decimal)row["Value12"];
                                }
                                else //Nếu value12 và 13 chưa có thì điền value1 == null để tránh bị lặp vòng tròn. 
                                {
                                    row["Value1"] = System.DBNull.Value;       //Nếu để có giá trị là bị lặp vô hạn
                                }
                            }
                            else //Nếu không xuất âm thì tính toán bình thường
                            {
                                _AllowSave = true; //Bật cờ được lưu 
                                TinhGiaVonLaiTungDong(row);
                                if (row["Value2"] is decimal) row["Value3"] = (decimal)row["Value1"] * (decimal)row["Value2"];
                                if (row["Value4"] is decimal) row["Value5"] = (decimal)row["Value1"] * (decimal)row["Value4"];
                                if (row["Value6"] is decimal) row["Value7"] = (decimal)row["Value1"] * (decimal)row["Value6"];
                                if (row["Value12"] is decimal) row["Value13"] = (decimal)row["Value1"] * (decimal)row["Value12"];
                            }
                        }
                        break;
                    case "Value2":
                        if (row["Value1"] is decimal && (decimal)row["Value2"] > 0)
                        {
                            if (!(row["Value3"] is decimal) || (decimal)row["Value3"] != (decimal)row["Value1"] * (decimal)row["Value2"])
                                row["Value3"] = (decimal)row["Value1"] * (decimal)row["Value2"];
                        }
                        break;
                    case "Value3"://Tien nhap kho NT
                        //TienXKQD
                        if (row["Value1"] is decimal && (decimal)row["Value1"] > 0)
                        {
                            if (!(row["Value2"] is decimal) || (decimal)row["Value2"] != (decimal)row["Value3"] / (decimal)row["Value1"])
                                row["Value2"] = (decimal)row["Value3"] / (decimal)row["Value1"];
                        }
                        break;
                    case "Value4"://DonGiaNT
                        if ((Guid)cmbThueSuat.EditValue != Guid.Empty)
                        {
                            Guid thueSuatID = (Guid)cmbThueSuat.EditValue;
                            if (!(row["Value6"] is decimal) || (decimal)row["Value6"] != (decimal)row["Value4"] / (1 - DanhMucThueSuat.Instance.GetByID(thueSuatID).MucThueSuat))
                            {
                                row["Value6"] = (decimal)row["Value4"] / (1 - DanhMucThueSuat.Instance.GetByID(thueSuatID).MucThueSuat);
                            }
                        }
                        if (row["Value1"] is decimal && row["Value4"] is decimal)
                        {
                            row["Value5"] = (decimal)row["Value1"] * (decimal)row["Value4"];
                        }
                        break;
                    case "Value6"://DonGiaNT
                        if ((Guid)cmbThueSuat.EditValue != Guid.Empty)
                        {
                            Guid thueSuatID = (Guid)cmbThueSuat.EditValue;
                            ThueSuat thueSuat = DanhMucThueSuat.Instance.GetByID(thueSuatID);
                           if (thueSuat != null)
                                if (!(row["Value4"] is decimal) || (decimal)row["Value4"] != (decimal)row["Value6"] - ((decimal)row["Value6"] * DanhMucThueSuat.Instance.GetByID(thueSuatID).MucThueSuat))
                                {
                                    row["Value4"] = (decimal)row["Value6"] - ((decimal)row["Value6"] * DanhMucThueSuat.Instance.GetByID(thueSuatID).MucThueSuat);
                                }
                        }
                        else
                        {
                            row["Value4"] = (decimal)row["Value6"];
                        }
                        if (row["Value1"] is decimal && row["Value6"] is decimal)
                        {
                            row["Value7"] = (decimal)row["Value1"] * (decimal)row["Value6"];
                            FillTongCong();
                        }
                        break;
                    case "Value8":
                        if (row["Value12"] != DBNull.Value && row["Value8"] != DBNull.Value)
                        {
                            row["Value6"] = Math.Round((decimal)row["Value12"] * (100 - (decimal)row["Value8"]) / 100);
                        }
                        break;
                    case "Value12":
                        if (row["Value12"] != DBNull.Value && row["Value8"] != DBNull.Value)
                        {
                            row["Value6"] = Math.Round((decimal)row["Value12"] * (100 - (decimal)row["Value8"]) / 100);
                        }
                        if (row["Value12"] != DBNull.Value && row["Value1"] != DBNull.Value)
                        {
                            e.Row["Value13"] = (decimal)e.Row["Value1"] * (decimal)e.Row["Value12"];
                        }
                        break;
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void TinhGiaVonLaiTungDong(DataRow row)
        {
            if (row["VatTuHangHoa1ID"] is Guid && row["Value1"] is decimal && cmbKho.EditValue is Guid)
                row["Value2"] = VatTuHangHoa.CalculateGiaXuatKho((Guid)row["VatTuHangHoa1ID"], (Guid)cmbKho.EditValue, dateNgay.DateTime, (decimal)row["Value1"]);
        }
        private void TinhToanTon(Guid khoID, Guid vatTuHangHoaID, ref TonKho tonTaiKhoNay, ref TonKho tonToanBo)
        {
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                if (khoID != Guid.Empty && vatTuHangHoaID != Guid.Empty)
                {
                    con.Open();
                    SqlCommand cmd = con.CreateCommand();
                    VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID(vatTuHangHoaID);
                    tonTaiKhoNay = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(cmd, dateNgay.DateTime, khoID, vatTuHangHoaID);
                    tonToanBo = TonKho.CalculateTongTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVao(cmd, dateNgay.DateTime, vatTuHangHoaID);
                    TonKho tongNhap = TonKho.CalculateTongMuaTheoThoiDiemKhoaSoGanNhat(cmd, dateNgay.DateTime, vatTuHangHoaID);
                    TonKho tongXuat = TonKho.CalculateTongBanTheoThoiDiemKhoaSoGanNhat(cmd, dateNgay.DateTime, vatTuHangHoaID);
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                con.Close();
            }
        }

        private void txtTongSoTien_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (txtSoTienKhachDua.EditValue is decimal && txtTongSoTien.EditValue is decimal)
                {
                    if ((decimal)txtSoTienKhachDua.EditValue >= (decimal)txtTongSoTien.EditValue)
                    {
                        lblTienThua.Text = "Tiền thừa";
                        txtSoTienTraLai.EditValue = (decimal)txtSoTienKhachDua.EditValue - (decimal)txtTongSoTien.EditValue;
                    }
                    else
                    {
                        lblTienThua.Text = "Tiền thiếu ";
                        txtSoTienTraLai.EditValue = (decimal)txtTongSoTien.EditValue - (decimal)txtSoTienKhachDua.EditValue;
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void txtSoTienKhachDua_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (txtSoTienKhachDua.EditValue is decimal && txtTongSoTien.EditValue is decimal)
                {
                    if ((decimal)txtSoTienKhachDua.EditValue >= (decimal)txtTongSoTien.EditValue)
                    {
                        lblTienThua.Text = "Tiền thừa";
                        txtSoTienTraLai.EditValue = (decimal)txtSoTienKhachDua.EditValue - (decimal)txtTongSoTien.EditValue;
                        txtSoTienTraLai.BackColor = Color.SkyBlue;
                    }
                    else
                    {
                        lblTienThua.Text = "Tiền thiếu ";
                        txtSoTienTraLai.EditValue = (decimal)txtTongSoTien.EditValue - (decimal)txtSoTienKhachDua.EditValue;
                        txtSoTienTraLai.BackColor = Color.LightSalmon;
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void btnThongKe_Click(object sender, EventArgs e)
        {
            try
            {
                ReportGenerators.BanHang.ThongKeBanHangLe.FrmThongKeBanLe frm = new ReportGenerators.BanHang.ThongKeBanHangLe.FrmThongKeBanLe();
                frm.Show();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void cmbDoiTuong_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                SendKeys.Send("{TAB}");
            }
        }
        private void cmbKho_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (cmbKho.EditValue is Guid && (Guid)cmbKho.EditValue != Guid.Empty && (Guid)cmbKho.EditValue != GeneralLibs.LocalSettings.HeThong.KhoID)
                {
                    GeneralLibs.LocalSettings.HeThong.KhoID = (Guid)cmbKho.EditValue;
                    GeneralLibs.LocalSettings.HeThong.Save2File();
                }
                if (cmbKho.Text == "" && cmbKho.EditValue == null) cmbKho.EditValue = Guid.Empty;

                Kho khoXuat = DanhMucKho.Instance.GetByID((Guid)cmbKho.EditValue);
                Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);

                if (store.Ten.ToUpper().Contains("VIETBOOK"))  // Nếu không là cty sách HN VietBook thì chỉ hiển thị thông báo
                {
                    if (khoXuat != null)
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, khoXuat.Ma + "BL", 7, true);
                    else
                        txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);
                }
                else
                    txtSo.Text = this.GenerateSoChungTuFromConfigInCauHinhKhac(DanhMucLoaiChungTu.Instance.GetByMa("HoaDonBanLe").ID, true);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void TruSoLuongBangPhimTat()
        {
            VatTuHangHoa selected = DanhMucVatTuHangHoa.GetByMaInHangHoaDangSuDung(cmbMaHang.Text);
            if (selected != null)
            {
                foreach (KhoanMucChungTu existed in _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc)
                {
                    if (existed.VatTuHangHoa1ID == selected.ID)
                    {
                        if (existed.Value1 > 1) //Nếu thuốc đó có số lượng lớn hơn 1 thì mới trừ
                        {
                            existed.Value1--;
                            if (lblThongTinTonKho.Text.Contains("SL"))
                                lblThongTinTonKho.Text = lblThongTinTonKho.Text.Replace("SL+", "SL-");
                            else if (!lblThongTinTonKho.Text.Contains("SL-"))
                                lblThongTinTonKho.Text = string.Format("SL- | {0}", lblThongTinTonKho.Text);
                        }
                        return; //Xong rồi thì không cần xem thuốc khác nữa. Vì Grid không được có 2 thuốc giống nhau
                    }
                }
            }
        }
        private void cmbMaHang_KeyPress(object sender, KeyPressEventArgs e)
        {
            try
            {
                if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty)
                {
                    FrmWarning.Show("Thông báo", "Chưa chọn kho.");
                    return;
                }
                if (cmbThueSuat.EditValue == null || (Guid)cmbThueSuat.EditValue == Guid.Empty)
                {
                    FrmWarning.Show("Thông báo", "Chưa chọn thuế suất");
                    cmbThueSuat.Focus();
                    return;
                }
                if (e.KeyChar == 13)
                {
                    VatTuHangHoa selected = DanhMucVatTuHangHoa.GetByMaInHangHoaDangSuDung(cmbMaHang.Text);
                    if (selected != null && _ChungTu != null)
                    {
                        DataRow[] existedRows = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.DataTable.Select("VatTuHangHoa1ID = '" + selected.ID.ToString() + "'");
                        if (existedRows.Length > 0)
                        {
                            if (!(existedRows[0]["Value1"] is decimal)) existedRows[0]["Value1"] = 0;
                            existedRows[0]["Value1"] = (decimal)existedRows[0]["Value1"] + 1;
                            if (lblThongTinTonKho.Text.Contains("SL"))
                                lblThongTinTonKho.Text = lblThongTinTonKho.Text.Replace("SL-", "SL+");
                            else if (!lblThongTinTonKho.Text.Contains("SL+"))
                                lblThongTinTonKho.Text = string.Format("SL+ | {0}", lblThongTinTonKho.Text);
                            return;
                        }
                        else
                        {
                            KhoanMucChungTu addedNew = _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.CreateNew();
                            addedNew.VatTuHangHoa1ID = selected.ID;
                            addedNew.Value1 = 1;
                            _ChungTu.DanhSachChungTuPhuThuoc[0].DanhSachKhoanMuc.Add(addedNew);
                        }
                    }
                    else if (selected == null)
                    {
                        //throw new CustomException("thuốc chưa có trong danh mục");
                        Store store = DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                        if (!store.Ten.ToUpper().Contains("VIETBOOK"))  // Nếu không là cty sách HN VietBook thì chỉ hiển thị thông báo
                        {
                            MessageBox.Show("Cảnh báo", "thuốc chưa có trong danh mục.");
                        }
                    }

                    cmbMaHang.Select();
                    cmbMaHang.Focus();
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void cmbMaHang_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (cmbMaHang.EditValue is Guid)
                {
                    VatTuHangHoa selected = DanhMucVatTuHangHoa.Instance.GetByID((Guid)cmbMaHang.EditValue);
                    if (selected == null)
                    {
                        //throw new CustomException("thuốc chưa có trong danh mục");
                        MessageBox.Show("thuốc chưa có trong danh mục");
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void btnReload_Click(object sender, EventArgs e)
        {
            try
            {
                BasicForms.FrmProgressBarDev.StartShowProgress();
                BasicForms.FrmProgressBarDev.Status = "Đang lấy danh mục thuốc mới nhất";
                try
                {
                    Thread threadReloadDanhMucHangHoa = new Thread(new ThreadStart(DanhMucVatTuHangHoa.Instance.LoadFromDB));
                    threadReloadDanhMucHangHoa.Start();
                    //DanhMucVatTuHangHoa.Instance.LoadFromDB();
                }
                catch (Exception ex)
                {
                    BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
                BasicForms.FrmProgressBarDev.FinishShowProgress();
            }
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            try
            {
                btnReload_Click(null, null);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void timerKhuyenMai_Tick(object sender, EventArgs e)
        {
            try
            {
                //Để 1phut check một lần. 
                timerKhuyenMai.Interval = 60000;
                // Xem có trong chương trình khuyến mại nào đang hoạt động không?
                DateTime curDateTimeFromServer = GeneralLibs.CommonLib.GetSystemDateTime();
                foreach (ChuongTrinhKhuyenMai chuongTrinhKhuyenMai in DanhMucChuongTrinhKhuyenMai.Instance)
                {
                    if (chuongTrinhKhuyenMai.NgayBatDau <= curDateTimeFromServer && curDateTimeFromServer < chuongTrinhKhuyenMai.NgayKetThuc)
                    {
                        _ActiveChuongTrinhKhuyenMai = chuongTrinhKhuyenMai;
                        break;
                    }
                    else
                    {
                        _ActiveChuongTrinhKhuyenMai = null;
                    }
                }

                if (_ActiveChuongTrinhKhuyenMai != null && (_EditState == EditState.CreatingNew || _EditState == EditState.Modifying))
                {
                    DoiTuongKhuyenMai dmDoiTuongKhuyenMai = null;
                    if (!(cmbDoiTuong.EditValue is Guid) || (Guid)cmbDoiTuong.EditValue == Guid.Empty)
                    {
                        if (lblKhuyenMai.Visible) lblKhuyenMai.Visible = false;
                    }
                    else
                    {
                        dmDoiTuongKhuyenMai = DanhMucDoiTuongKhuyenMai.Instance.GetByIDs(_ActiveChuongTrinhKhuyenMai.ID, (Guid)cmbDoiTuong.EditValue);
                        if (dmDoiTuongKhuyenMai != null)
                        {
                            lblKhuyenMai.Text = string.Format("{0} đang tham gia chương trình khuyến mại: {1}. Thời gian từ {2} dến {3}", dmDoiTuongKhuyenMai.DoiTuongNghiepVu.Ten, _ActiveChuongTrinhKhuyenMai.Ma, _ActiveChuongTrinhKhuyenMai.NgayBatDau, _ActiveChuongTrinhKhuyenMai.NgayKetThuc);
                        }
                        else
                        {
                            lblKhuyenMai.Text = "";
                        }
                        if (!lblKhuyenMai.Visible) lblKhuyenMai.Visible = true;
                    }
                }
                else if (lblKhuyenMai.Visible) lblKhuyenMai.Visible = false;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbDoiTuong_EditValueChanged(object sender, EventArgs e)
        {
            timerKhuyenMai_Tick(null, null);
        }

        private void btnTinhGiaXuatKho_Click(object sender, EventArgs e)
        {
            try
            {
                BasicForms.FrmProgressBarDev.StartShowProgress();
                BasicForms.FrmProgressBarDev.Status = "Đang tính giá vốn thuốc xuất kho";
                try
                {
                    int count = 0;
                    foreach (KhoanMucChungTu khoanMuc in _ChungTu.DanhSachKhoanMuc)
                    {
                        if (khoanMuc.DataRow.RowState != DataRowState.Unchanged)
                            khoanMuc.Value2 = VatTuHangHoa.CalculateGiaXuatKho(khoanMuc.VatTuHangHoa1ID, (Guid)cmbKho.EditValue, dateNgay.DateTime, khoanMuc.Value1);
                        count++;
                        BasicForms.FrmProgressBarDev.Status = string.Format("Đã tính {0}/{1}", count, _ChungTu.DanhSachKhoanMuc.Count);
                    }
                }
                catch (SqlException sqlEx)
                {
                    throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
                }
                catch (Exception ex)
                {
                    if (ex is CustomException) throw ex;
                    else
                    {
                        throw new Exception(ex.Message);
                    }
                }
                BasicForms.FrmProgressBarDev.FinishShowProgress();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        public string GenerateSoChungTuFromConfigInCauHinhKhac(Guid loaiChungTuID, bool tangTheoTungSoMay_ChiDungKhiChonFixTrongCode)
        {
            try
            {
                if (Config.CachSinhSoChungTu == CachSinhSoChungTu.FixTrongCode)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, tangTheoTungSoMay_ChiDungKhiChonFixTrongCode, tangTheoTungSoMay_ChiDungKhiChonFixTrongCode);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoTungSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, true, true);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_KhongCoSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, false, false);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_CoSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, true, false);
                }
                else
                {
                    return "";
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                return "";
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        public string GenerateSoChungTuFromConfigInCauHinhKhac(Guid loaiChungTuID, string prefix, int noDigits, bool tangTheoTungSoMay_ChiDungKhiChonFixTrongCode)
        {
            try
            {
                if (Config.CachSinhSoChungTu == CachSinhSoChungTu.FixTrongCode)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, prefix, noDigits, tangTheoTungSoMay_ChiDungKhiChonFixTrongCode, tangTheoTungSoMay_ChiDungKhiChonFixTrongCode);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoTungSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, prefix, noDigits, true, true);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_KhongCoSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, prefix, noDigits, false, false);
                }
                else if (Config.CachSinhSoChungTu == CachSinhSoChungTu.TangTheoToanBoHeThong_CoSoMay)
                {
                    return GeneralLibs.CommonLib.GetSoChungTuMacDinh(loaiChungTuID, prefix, noDigits, true, false);
                }
                else
                {
                    return "";
                }
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                return "";
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
        }
        public bool CheckExistedSoChungTuKhongKemSoMayInDB(string soChungTu, Guid chungTuID)
        {
            SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
            try
            {
                con.Open();
                if (CommonLib.StartWithSoMay(soChungTu)) soChungTu = CommonLib.CutSoMayWithOutSoChungTu(soChungTu);
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandText = string.Format("SELECT * FROM ChungTu WHERE DATEPART(yyyy, Ngay) = {0} AND SoKhongKemSoMay = N'{1}' AND ChungTuID <> '{2}'",
                   GeneralLibs.Config.NamTaiChinh, soChungTu, chungTuID);
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read()) return true;
                else return false;
            }
            finally
            {
                con.Close();
            }
        }
        private void FrmEditRelativeChungTu_ResolveConflictSoChungTu(string soChungTu, bool isChungTuGoc, bool showQuestion)
        {
            try
            {
                if (isChungTuGoc)
                {
                    if (showQuestion)
                    {
                        if (MessageBox.Show(string.Format("Đã có chứng từ số {0} cùng năm tài chính tồn tại trong CSDL.\nBạn có muốn tự động tăng số chứng từ lên 1 đơn vị không?", soChungTu),
                           "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                        {
                            txtSo.EditValue = CommonLib.TangSoChungTuTuDong(soChungTu, 1);
                        }
                    }
                    else
                    {
                        txtSo.EditValue = CommonLib.TangSoChungTuTuDong(soChungTu, 1);
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        #region Xu ly hien thi thong tin ton kho
        private void cmbMaHang_RequireShowThongTinTonKho(object sender, Guid vatTuHangHoaID)
        {
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty) return;
            try
            {
                TinhToanVaHienThiTon((Guid)cmbKho.EditValue, vatTuHangHoaID);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void cmbMaHang_RequireHideThongTinTonKho(object sender)
        {
            lblThongTinTonKho.Visible = false;
        }

        private void customGridKhoanMuc_RequireShowThongTinTonKho(object sender, Guid vatTuHangHoaID)
        {
            if (!(cmbKho.EditValue is Guid) || (Guid)cmbKho.EditValue == Guid.Empty) return;
            try
            {
                TinhToanVaHienThiTon((Guid)cmbKho.EditValue, vatTuHangHoaID);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void customGridKhoanMuc_RequireHideThongTinTonKho(object sender)
        {
            lblThongTinTonKho.Visible = false;
        }

        private void TinhToanVaHienThiTon(Guid khoID, Guid vatTuHangHoaID)
        {
            if (khoID == Guid.Empty || vatTuHangHoaID == Guid.Empty) return;
            if (_EditState == EditState.CreatingNew) dateNgay.EditValue = GeneralLibs.CommonLib.GetSystemDateTime();
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                VatTuHangHoa vthh = DanhMucVatTuHangHoa.Instance.GetByID(vatTuHangHoaID);
                TonKho tonTaiKhoNay = TonKho.CalculateTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVaoTheoKho(cmd, dateNgay.DateTime.AddSeconds(-1), khoID, vatTuHangHoaID);
                TonKho tonToanBo = TonKho.CalculateTongTonTuThoiDiemKhoaSoGanNhatDenThoiDiemNhapVao(cmd, dateNgay.DateTime.AddSeconds(-1), vatTuHangHoaID);
                TonKho tongNhap = TonKho.CalculateTongMuaTheoThoiDiemKhoaSoGanNhat(cmd, dateNgay.DateTime.AddSeconds(-1), vatTuHangHoaID);
                TonKho tongXuat = TonKho.CalculateTongBanTheoThoiDiemKhoaSoGanNhat(cmd, dateNgay.DateTime.AddSeconds(-1), vatTuHangHoaID);

                //lblThongTinTonKho.Text = string.Format("CK: {3}| Tại {0}: {1} | Tồn tổng: {2}",
                //    cmbKho.Text, (int)tonTaiKhoNay.SoLuong, (int)tonToanBo.SoLuong, vthh.ChietKhauBan);

                lblThongTinTonKho.Text = string.Format(" Tổng tồn: {0} |  Tồn tại quầy: {1}",
                    (int)tonToanBo.SoLuong, (int)tonTaiKhoNay.SoLuong);
                lblThongTinTonKho.Visible = true;
            }
            catch (SqlException sqlEx)
            {
                throw new CustomException(CustomException.GetSqlExceptionMessage(sqlEx));
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            finally
            {
                con.Close();
            }
        }

        #endregion

        private void customGridKhoanMuc_XoaKhoanMuc(object sender, DataRow row)
        {
            try
            {
                //Xóa khoản mục khỏi CSDL 
                _ChungTu.DanhSachKhoanMuc.DeleteSingleKhoanMucFromDB(row);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void nmrTuoi_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int tuoi = -1;
                int.TryParse(nmrTuoi.Text, out tuoi);
                if (tuoi <= 6)
                    txtNguoiGiamHo.Properties.ReadOnly = false;
                else
                    txtNguoiGiamHo.Properties.ReadOnly = true;
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void chkIsETC_CheckedChanged(object sender, EventArgs e)
        {
            try
            {
                btnLuuAnh.Visible = chkIsETC.Checked;
                btnXemAnh.Visible = chkIsETC.Checked;

                //ETC là các hàng bán cần đơn
                //OTC là các hàng không cần đơn
                //cmbMaHang.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                if (!chkIsETC.Checked)
                    cmbMaHang.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaForOTC().DataView;
                else
                    cmbMaHang.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaForNoneOTC().DataView;

                #region DataForGrid
                CustomControls.DataForGrid dataForGrid = null;

                dataForGrid = new CustomControls.DataForGrid();
                customGridKhoanMuc.PopupHeight = 297;
                customGridKhoanMuc.PopupWidth = 550;

                //dataForGrid.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaDangSuDung().DataView;
                if (!chkIsETC.Checked)
                    dataForGrid.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaForOTC().DataView;
                else
                    dataForGrid.DataSource = DanhMucVatTuHangHoa.GetDanhMucHangHoaForNoneOTC().DataView;
                dataForGrid.AddVisibleColumn("Ma", "Mã", 100, 1);
                dataForGrid.AddVisibleColumn("Ten", "Tên", 150, 2);
                dataForGrid.AddVisibleColumn("HoatChat", "Hoạt chất", 150, 3); dataForGrid.AddVisibleColumn("GiaBia", "Giá bán", 35, 4);
                dataForGrid.DisplayColumn = "Ma";
                dataForGrid.ValueColumn = "ID";
                customGridKhoanMuc.HtDataForGrid.Clear();
                customGridKhoanMuc.HtDataForGrid.Add("VatTuHangHoa1ID", dataForGrid);
                #endregion
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void btnLuuAnh_Click(object sender, EventArgs e)
        {
            string pathSource = "";
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() != DialogResult.Cancel)
            {
                CreateAttachment(openFileDialog.FileName);  //upload the attachment
            }
        }
        private void btnXemAnh_Click(object sender, EventArgs e)
        {
            SaveAttachment();
        }
        private void CreateAttachment(string strFile)
        {
            try
            {
                FileStream objFileStream = new FileStream(strFile, FileMode.Open, FileAccess.Read);
                int intLength = Convert.ToInt32(objFileStream.Length);
                byte[] objData;
                objData = new byte[intLength];
                DataRow objRow;
                string[] strPath = strFile.Split(Convert.ToChar(@"\"));

                objFileStream.Read(objData, 0, intLength);
                objFileStream.Close();

                _ChungTu.AnhHoaDon = objData;  //our file
                _ChungTu.TenAnh = strPath[strPath.Length - 1];
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void SaveAttachment()
        {
            try
            {
                if (_ChungTu.AnhHoaDon.GetType().ToString() == "System.DBNull" || _ChungTu.AnhHoaDon.Length <= 0)  //không có ảnh đính kèm
                {
                    MessageBox.Show("Hóa đơn này không có đơn thuốc lưu kèm");
                    return;
                }
                byte[] objData;
                objData = _ChungTu.AnhHoaDon;
                string strFileToSave = "";

                //Tự lưu file vào thư mục FileDinhKem trong thu mục gốc
                strFileToSave = Application.StartupPath + string.Format("\\AnhKemHoaDon\\{0}-{1}", _ChungTu.So, _ChungTu.TenAnh);
                string strFolderContain = Application.StartupPath + "\\AnhKemHoaDon";

                if (!Directory.Exists(strFolderContain))
                {
                    Directory.CreateDirectory(strFolderContain);
                }

                FileStream objFileStream = new FileStream(strFileToSave, FileMode.Create, FileAccess.Write);
                objFileStream.Write(objData, 0, objData.Length);
                objFileStream.Close();

                //Mở File tự động
                Process myProcess = new Process();

                try
                {
                    if (strFileToSave != "")
                    {
                        System.Diagnostics.Process.Start(strFileToSave);
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
            catch (Exception ex)
            {
                FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void cmbThueSuat_EditValueChanged(object sender, EventArgs e)
        {
                try
                {
                    if (_EditState == EditState.SavedInLedger || _EditState == EditState.Saved || _EditState == EditState.Undefined) return;  //Khi đã lưu rồi thì chỉ cần load lên thôi. K cần update
                    if (!(cmbThueSuat.EditValue is Guid) || (Guid)cmbThueSuat.EditValue == Guid.Empty) return;

                    FrmProgressBarDev.StartShowProgress("Đang tính lại thuế suất cho từng hàng hóa");
                    foreach (DataRow row in _GridDataSouce.Rows)
                    {
                        decimal chietKhau = Convert.ToDecimal(row["Value8"].ToString());
                        row["Value8"] = chietKhau;
                    }
                }
                catch (Exception ex)
                {
                    BasicForms.FrmExceptionNotifier.Log(ex);
                }
                finally
                {
                    FrmProgressBarDev.FinishShowProgress();
                }
        }
    }
}
